home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / ipdump.c < prev    next >
C/C++ Source or Header  |  1989-02-22  |  3KB  |  147 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "internet.h"
  5. #include "timer.h"
  6. #include "iface.h"
  7. #include "ip.h"
  8. #include "trace.h"
  9. #include "netuser.h"
  10.  
  11. #ifdef MAC
  12.     extern int tcptrcflg;
  13.     extern FILE *trcwndp;
  14. #endif
  15.  
  16. int
  17. ip_dump(bpp,check)
  18. struct mbuf **bpp;
  19. int check;
  20. {
  21.     void tcp_dump(),udp_dump(),icmp_dump();
  22.     struct ip ip;
  23.     int16 ip_len;
  24.     int16 offset;
  25.     int16 length;
  26.     int16 csum;
  27.  
  28.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  29.         return;    
  30.  
  31. #ifdef MAC
  32.     fprintf(trcwndp,"IP:");
  33.     /* Sneak peek at IP header and find length */
  34.     ip_len = ((*bpp)->data[0] & 0xf) << 2;
  35.     if(ip_len < IPLEN){
  36.         fprintf(trcwndp," bad header\n");
  37.         return;
  38.     }
  39.     if(check)
  40.         csum = cksum(NULLHEADER,*bpp,ip_len);
  41.     else
  42.         csum = 0;
  43.  
  44.     ntohip(&ip,bpp);    /* Can't fail, we've already checked ihl */
  45.  
  46.     /* Trim data segment if necessary. */
  47.     length = ip.length - ip_len;    /* Length of data portion */
  48.     trim_mbuf(bpp,length);    
  49.     fprintf(trcwndp," len %u",ip.length);
  50.     fprintf(trcwndp," %s",inet_ntoa(ip.source));
  51.     fprintf(trcwndp,"->%s ihl %u ttl %u",
  52.         inet_ntoa(ip.dest),ip_len,uchar(ip.ttl));
  53.     if(ip.tos != 0)
  54.         fprintf(trcwndp," tos %u",uchar(ip.tos));
  55.     offset = (ip.fl_offs & F_OFFSET) << 3;
  56.     if(offset != 0 || (ip.fl_offs & MF))
  57.         fprintf(trcwndp," id %u offs %u",ip.id,offset);
  58.     if(ip.fl_offs & DF)
  59.         fprintf(trcwndp," DF");
  60.     if(ip.fl_offs & MF){
  61.         fprintf(trcwndp," MF");
  62.         check = 0;    /* Bypass host-level checksum verify */
  63.     }
  64.     if(csum != 0)
  65.         fprintf(trcwndp," CHECKSUM ERROR (%u)",csum);
  66.  
  67.     if(offset != 0){
  68.         fprintf(trcwndp,"\n");
  69.         return;
  70.     }
  71.     switch(uchar(ip.protocol)){
  72.     case TCP_PTCL:
  73.         fprintf(trcwndp," prot TCP\n");
  74.         tcp_dump(bpp,ip.source,ip.dest,check);
  75.         break;
  76.     case UDP_PTCL:
  77.         fprintf(trcwndp," prot UDP\n");
  78.         udp_dump(bpp,ip.source,ip.dest,check);
  79.         break;
  80.     case ICMP_PTCL:
  81.         fprintf(trcwndp," prot ICMP\n");
  82.         icmp_dump(bpp,ip.source,ip.dest,check);
  83.         break;
  84.     default:
  85.         fprintf(trcwndp," prot %u\n",uchar(ip.protocol));
  86. #else
  87.     printf("IP:");
  88.     /* Sneak peek at IP header and find length */
  89.     ip_len = ((*bpp)->data[0] & 0xf) << 2;
  90.     if(ip_len < IPLEN){
  91.         printf(" bad header\n");
  92.         return;
  93.     }
  94.     if(check)
  95.         csum = cksum(NULLHEADER,*bpp,ip_len);
  96.     else
  97.         csum = 0;
  98.  
  99.     ntohip(&ip,bpp);    /* Can't fail, we've already checked ihl */
  100.  
  101.     /* Trim data segment if necessary. */
  102.     length = ip.length - ip_len;    /* Length of data portion */
  103.     trim_mbuf(bpp,length);    
  104.     printf(" len %u",ip.length);
  105.     printf(" %s",inet_ntoa(ip.source));
  106.     printf("->%s ihl %u ttl %u",
  107.         inet_ntoa(ip.dest),ip_len,uchar(ip.ttl));
  108.     if(ip.tos != 0)
  109.         printf(" tos %u",uchar(ip.tos));
  110.     offset = (ip.fl_offs & F_OFFSET) << 3;
  111.     if(offset != 0 || (ip.fl_offs & MF))
  112.         printf(" id %u offs %u",ip.id,offset);
  113.     if(ip.fl_offs & DF)
  114.         printf(" DF");
  115.     if(ip.fl_offs & MF){
  116.         printf(" MF");
  117.         check = 0;    /* Bypass host-level checksum verify */
  118.     }
  119.     if(csum != 0)
  120.         printf(" CHECKSUM ERROR (%u)",csum);
  121.  
  122.     if(offset != 0){
  123.         printf("\n");
  124.         return;
  125.     }
  126.     switch(uchar(ip.protocol)){
  127.     case TCP_PTCL:
  128.         printf(" prot TCP\n");
  129.         tcp_dump(bpp,ip.source,ip.dest,check);
  130.         break;
  131.     case UDP_PTCL:
  132.         printf(" prot UDP\n");
  133.         udp_dump(bpp,ip.source,ip.dest,check);
  134.         break;
  135.     case ICMP_PTCL:
  136.         printf(" prot ICMP\n");
  137.         icmp_dump(bpp,ip.source,ip.dest,check);
  138.         break;
  139.     default:
  140.         printf(" prot %u\n",uchar(ip.protocol));
  141. #endif
  142.         break;
  143.     }
  144. }
  145.  
  146.  
  147.